En este tutorial, utilizará un conjunto de datos de UCI . El conjunto de datos se llama Online-Retail y contiene datos de transacciones del 12/01/2010 al 12/09/2011 para una tienda minorista en lÃnea registrada en el Reino Unido.
Descripción del conjunto de datos Número de filas: 541,909 Número de atributos: 8
Factura No: número de factura. Nominal, un número integral de 6 dÃgitos asignado exclusivamente a cada transacción. Si este código comienza con la letra ‘c’, indica una cancelación. + StockCode: Código de producto (artÃculo). Nominal, un número integral de 5 dÃgitos asignado exclusivamente a cada producto distinto.
Descripción: Nombre del producto (artÃculo). Nominal.
Cantidad: las cantidades de cada producto (artÃculo) por transacción. Numérico.
Fecha de factura: Fecha y hora de la factura. Numérico, el dÃa y la hora en que se generó cada transacción. Ejemplo del conjunto de datos: 12/1/2010 8:26
Precio unitario: precio unitario. Numérico, precio del producto por unidad en libras esterlinas.
CustomerID: número de cliente. Nominal, un número entero de 5 dÃgitos asignado exclusivamente a cada cliente.
PaÃs: nombre del paÃs. Nominal, el nombre del paÃs donde reside cada cliente.
UtilÃcelo read_excel(path to file)para leer el conjunto de datos del archivo descargado en R. Dé su ruta completa al archivo, incluido el nombre de archivo enread_excel(path-to-file-with-filename)
#read excel into R dataframe
retail <- read_excel('/Users/sergio/Documents/Proyectos/Ejemplos Modelos/MBA/Data/Online Retail.xlsx')
| Paquete | Descripción |
|---|---|
| arules | Proporciona la infraestructura para representar, manipular y analizar datos y patrones de transacciones (conjuntos de elementos frecuentes y reglas de asociación). |
| arulesViz | Extiende el paquete ‘arules’ con varias técnicas de visualización para reglas de asociación y conjuntos de elementos. El paquete también incluye varias visualizaciones interactivas para la exploración de reglas. |
| tidyverse | El tidyverse es una colección obvia de paquetes R diseñados para la ciencia de datos. |
| readxl | Leer archivos de Excel en R |
| plyr | Herramientas para dividir, aplicar y combinar datos |
| ggplot2 | Crea gráficos y cuadros |
| knitr | Generación dinámica de informes en R |
| lubridate | Lubridate es un paquete R que facilita el trabajo con fechas y horas. |
#complete.cases(data) devolverá un vector lógico que indica qué filas no tienen valores faltantes. Luego use el vector para obtener solo las filas que están completas usando retail[,].
retail <- retail[complete.cases(retail), ]
#mutate La función es del paquete dplyr. Se utiliza para editar o agregar nuevas columnas al marco de datos. Aquà la columna Descripción se está convirtiendo en columna de factor. as.factor convierte la columna en columna de factor. %>% es un operador con el que puede canalizar valores a otra función o expresión
retail %>% mutate(Description = as.factor(Description))
retail %>% mutate(Country = as.factor(Country))
# Convierte datos de caracteres hasta la fecha. Almacenar Factura Fecha como fecha en nueva variable
retail$Date <- as.Date(retail$InvoiceDate)
#Extraiga el tiempo de InvoiceDate y almacene en otra variable
TransTime<- format(retail$InvoiceDate,"%H:%M:%S")
#Convierta y edite Factura No en numérico
InvoiceNo <- as.numeric(as.character(retail$InvoiceNo))
## Warning: NAs introduced by coercion
# Vincula nuevas columnas TransTime y InvoiceNo al comercio minorista de marcos de datos
cbind(retail,TransTime)
cbind(retail,InvoiceNo)
# echar un vistazo a sus datos
glimpse(retail)
## Observations: 406,829
## Variables: 9
## $ InvoiceNo <chr> "536365", "536365", "536365", "536365", "536365", "536365…
## $ StockCode <chr> "85123A", "71053", "84406B", "84029G", "84029E", "22752",…
## $ Description <chr> "WHITE HANGING HEART T-LIGHT HOLDER", "WHITE METAL LANTER…
## $ Quantity <dbl> 6, 6, 8, 6, 6, 2, 6, 6, 6, 32, 6, 6, 8, 6, 6, 3, 2, 3, 3,…
## $ InvoiceDate <dttm> 2010-12-01 08:26:00, 2010-12-01 08:26:00, 2010-12-01 08:…
## $ UnitPrice <dbl> 2.55, 3.39, 2.75, 3.39, 3.39, 7.65, 4.25, 1.85, 1.85, 1.6…
## $ CustomerID <dbl> 17850, 17850, 17850, 17850, 17850, 17850, 17850, 17850, 1…
## $ Country <chr> "United Kingdom", "United Kingdom", "United Kingdom", "Un…
## $ Date <date> 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-…
#ddply(dataframe, variables que se utilizarán para dividir el marco de datos, función que se aplicará)
transactionData <- ddply(retail,c("InvoiceNo","Date"),
function(df1)paste(df1$Description,
collapse = ","))
# La función de R paste() concatena vectores a caracteres y resultados separados usando collapse=[cualquier cadena de caracteres opcional]. Aquà usamos ','.
glimpse(transactionData)
## Observations: 22,190
## Variables: 3
## $ InvoiceNo <chr> "536365", "536366", "536367", "536368", "536369", "536370",…
## $ Date <date> 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-01, 2010-12-01…
## $ V1 <chr> "WHITE HANGING HEART T-LIGHT HOLDER,WHITE METAL LANTERN,CRE…
head(transactionData)
#set column InvoiceNo of dataframe transactionData
transactionData$InvoiceNo <- NULL
#set column Date of dataframe transactionData
transactionData$Date <- NULL
#Rename column to items
colnames(transactionData) <- c("items")
#Show Dataframe transactionData
head(transactionData)
write.csv(transactionData,"/Users/sergio/Documents/Proyectos/Ejemplos Modelos/MBA/Data/market_basket_transactions.csv", quote = FALSE, row.names = FALSE)
387/5000
## [1] 0.0774
#transactionData: datos que se escribirán
# "D: /Documents/market_basket.csv": ubicación del archivo con el nombre del archivo en el que se escribirá
#quote: si es VERDADERO, rodeará la columna de caracteres o factores con comillas dobles. Si FALSO no se citará nada
# row.names: un valor lógico que indica si los nombres de fila de x deben escribirse junto con x, o un vector de caracteres de los nombres de fila que deben escribirse.
tr <- read.transactions('/Users/sergio/Documents/Proyectos/Ejemplos Modelos/MBA/Data/market_basket_transactions.csv', format = 'basket', sep=',')
#sep indica cómo se separan los elementos. En este caso te has separado usando ','
summary(tr)
## transactions as itemMatrix in sparse format with
## 22191 rows (elements/itemsets/transactions) and
## 7876 columns (items) and a density of 0.001930725
##
## most frequent items:
## WHITE HANGING HEART T-LIGHT HOLDER REGENCY CAKESTAND 3 TIER
## 1803 1709
## JUMBO BAG RED RETROSPOT PARTY BUNTING
## 1460 1285
## ASSORTED COLOUR BIRD ORNAMENT (Other)
## 1250 329938
##
## element (itemset/transaction) length distribution:
## sizes
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
## 3598 1594 1141 908 861 758 696 676 663 593 624 537 516 531 551 522
## 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
## 464 441 483 419 395 315 306 272 238 253 229 213 222 215 170 159
## 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
## 138 142 134 109 111 90 113 94 93 87 88 65 63 67 63 60
## 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
## 59 49 64 40 41 49 43 36 29 39 30 27 28 17 25 25
## 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 20 27 24 22 15 20 19 13 16 16 11 15 12 7 9 14
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
## 15 12 8 9 11 11 14 8 6 5 6 11 6 4 4 3
## 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
## 6 5 2 4 2 4 4 3 2 2 6 3 4 3 2 1
## 113 114 116 117 118 120 121 122 123 125 126 127 131 132 133 134
## 3 1 3 3 3 1 2 2 1 3 2 2 1 1 2 1
## 140 141 142 143 145 146 147 150 154 157 168 171 177 178 180 202
## 1 2 2 1 1 2 1 1 3 2 2 2 1 1 1 1
## 204 228 236 249 250 285 320 400 419
## 1 1 1 1 1 1 1 1 1
##
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 3.00 10.00 15.21 21.00 419.00
##
## includes extended item information - examples:
## labels
## 1 1 HANGER
## 2 10 COLOUR SPACEBOY PEN
## 3 12 COLOURED PARTY BALLOONS
# Create an item frequency plot for the top 20 items
if (!require("RColorBrewer")) {
# install color package of R
install.packages("RColorBrewer")
#include library RColorBrewer
library(RColorBrewer)
}
## Loading required package: RColorBrewer
itemFrequencyPlot(tr,topN=20,type="absolute",col=brewer.pal(8,'Pastel2'), main="Absolute Item Frequency Plot")
itemFrequencyPlot(tr,topN=20,type="relative",col=brewer.pal(8,'Pastel2'),main="Relative Item Frequency Plot")
# Min Support as 0.001, confidence as 0.8.
association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=10))
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.8 0.1 1 none FALSE TRUE 5 0.001 1
## maxlen target ext
## 10 rules FALSE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 22
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[7876 item(s), 22191 transaction(s)] done [0.24s].
## sorting and recoding items ... [2324 item(s)] done [0.01s].
## creating transaction tree ... done [0.03s].
## checking subsets of size 1 2 3 4 5 6 7 8 9 10
## Warning in apriori(tr, parameter = list(supp = 0.001, conf = 0.8, maxlen = 10)):
## Mining stopped (maxlen reached). Only patterns up to a length of 10 returned!
## done [0.59s].
## writing ... [49122 rule(s)] done [0.06s].
## creating S4 object ... done [0.03s].
inspect(association.rules[1:10])
shorter.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8,maxlen=3))
subset.rules <- which(colSums(is.subset(association.rules, association.rules)) > 1) # get subset rules in vector
length(subset.rules) #> 3913
subset.association.rules. <- association.rules[-subset.rules] # remove subset rules.
metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(default="lhs",rhs="METAL"))
# Here lhs=METAL because you want to find out the probability of that in how many customers buy METAL along with other items
inspect(head(metal.association.rules))
metal.association.rules <- apriori(tr, parameter = list(supp=0.001, conf=0.8),appearance = list(lhs="METAL",default="rhs"))
# Here lhs=METAL because you want to find out the probability of that in how many customers buy METAL along with other items
inspect(head(metal.association.rules))
# Filter rules with confidence greater than 0.4 or 40%
subRules<-association.rules[quality(association.rules)$confidence>0.4]
#Plot SubRules
plot(subRules)
plot(subRules,method="two-key plot")
plotly_arules(subRules)
top10subRules <- head(subRules, n = 10, by = "confidence")
plot(top10subRules, method = "graph", engine = "htmlwidget")
saveAsGraph(head(subRules, n = 1000, by = "lift"), file = "rules.graphml")
# Filter top 20 rules with highest lift
subRules2<-head(subRules, n=20, by="lift")
plot(subRules2, method="paracoord")